package com.njwb.day13;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public class Main {
    public static void main(String[] args) throws ClassNotFoundException, InvocationTargetException, InstantiationException, IllegalAccessException, NoSuchMethodException, NoSuchFieldException {
        Class<?> clazz1 = Person.class;
        Class<?> clazz2 = new Person().getClass();
/* Class<?> clazz3 = Class.forName("com/njwb/day13/Person");*/

        System.out.println(clazz1.getName());       // 包名+类名
        System.out.println(clazz1.getSimpleName()); // 类名
        System.out.println(clazz1.getSuperclass()); // 父类
        System.out.println("**********************************************");
        Field[] fields = clazz1.getDeclaredFields(); // 所有字段（包括私有）
        for (Field field : fields) {
            System.out.println(field.getName());
        }
        System.out.println("**********************************************");
        Method[] methods = clazz1.getDeclaredMethods(); // 所有方法（包括私有）
        for (Method method : methods) {
            System.out.println(method.getName());
        }
        System.out.println("**********************************************");
        //获取构造器并创建对象
        Constructor<?> cons = clazz1.getConstructor(String.class, int.class);
        Object obj = cons.newInstance("Tom", 25);
        Method m = clazz1.getDeclaredMethod("sayHello");
        m.setAccessible(true); // 打破 private 访问限制
        m.invoke(obj);         // 执行方法
        System.out.println("**********************************************");

        Field nameField = clazz1.getDeclaredField("name");
        nameField.setAccessible(true); // 打破私有访问限制
        nameField.set(obj, "Alice");   // 设置字段
        System.out.println(nameField.get(obj)); // 获取字段值



    }
}
